package com.company.section2;

import java.util.ArrayList;

/**
 * 组装这个树形结构，并展示出来
 * 《设计模式之禅》
 */
public class Client {

	public static void main(String[] args) {
		//首先是组装一个组织结构出来
		Branch ceo = compositeCorpTree();
		
		//首先把CEO的信息打印出来：
		System.out.println(ceo.getInfo());
		
		//然后是所有员工信息
		System.out.println(getTreeInfo(ceo));
	}
	
	//把整个树组装出来
	public static Branch compositeCorpTree(){
		//首先产生总经理CEO
		Branch root = new Branch("王大麻子","总经理",100000);
		//把三个部门经理产生出来
		Branch developDep = new Branch("刘大瘸子","研发部门经理",10000);
		Branch salesDep = new Branch("马二拐子","销售部门经理",20000);
		Branch financeDep = new Branch("赵三驼子","财务部经理",30000);
		
		//再把三个小组长产生出来
		Branch firstDevGroup = new Branch("杨三乜斜","开发一组组长",5000);
		Branch secondDevGroup = new Branch("吴大棒槌","开发二组组长",6000);
		
		//把所有的小兵都产生出来
		Leaf a = new Leaf("a","开发人员",2000);
		Leaf b = new Leaf("b","开发人员",2000);
		Leaf c = new Leaf("c","开发人员",2000);
		Leaf d = new Leaf("d","开发人员",2000);
		Leaf e = new Leaf("e","开发人员",2000);
		Leaf f = new Leaf("f","开发人员",2000);
		Leaf g = new Leaf("g","开发人员",2000);
		Leaf h = new Leaf("h","销售人员",5000);
		Leaf i = new Leaf("i","销售人员",4000);
		Leaf j = new Leaf("j","财务人员",5000);
		Leaf k = new Leaf("k","CEO秘书",8000);
		Leaf zhengLaoLiu = new Leaf("郑老六","研发部副经理",20000);
		
		//开始组装
		//CEO下有三个部门经理和一个秘书
		root.addSubordinate(k);
		root.addSubordinate(developDep);
		root.addSubordinate(salesDep);
		root.addSubordinate(financeDep);

		//研发部经理
		developDep.addSubordinate(zhengLaoLiu);
		developDep.addSubordinate(firstDevGroup);
		developDep.addSubordinate(secondDevGroup);

		//看看开发两个开发小组下有什么
		firstDevGroup.addSubordinate(a);
		firstDevGroup.addSubordinate(b);
		firstDevGroup.addSubordinate(c);
		secondDevGroup.addSubordinate(d);
		secondDevGroup.addSubordinate(e);
		secondDevGroup.addSubordinate(f);
		
		//再看销售部下的人员情况
		salesDep.addSubordinate(h);
		salesDep.addSubordinate(i);
		
		//最后一个财务
		financeDep.addSubordinate(j);
		
		return root;
	}
	
	//遍历整棵树,只要给我跟节点，我就能遍历出所有的节点
	public static String getTreeInfo(Branch root){
		ArrayList<ICorp> subordinateList = root.getSubordinate();
		String info = "";
		for(ICorp s :subordinateList){
			if(s instanceof Leaf){ //是员工就直接获得信息
				info = info + s.getInfo()+"\n";
			}else{ //是个小头目
				info = info + s.getInfo() +"\n"+ getTreeInfo((Branch)s);
			}
		}
		return info;
	}
}
/* Output:
姓名：王大麻子	职位：总经理	薪水：100000
姓名：k	职位：CEO秘书	薪水：8000
姓名：刘大瘸子	职位：研发部门经理	薪水：10000
姓名：郑老六	职位：研发部副经理	薪水：20000
姓名：杨三乜斜	职位：开发一组组长	薪水：5000
姓名：a	职位：开发人员	薪水：2000
姓名：b	职位：开发人员	薪水：2000
姓名：c	职位：开发人员	薪水：2000
姓名：吴大棒槌	职位：开发二组组长	薪水：6000
姓名：d	职位：开发人员	薪水：2000
姓名：e	职位：开发人员	薪水：2000
姓名：f	职位：开发人员	薪水：2000
姓名：马二拐子	职位：销售部门经理	薪水：20000
姓名：h	职位：销售人员	薪水：5000
姓名：i	职位：销售人员	薪水：4000
姓名：赵三驼子	职位：财务部经理	薪水：30000
姓名：j	职位：财务人员	薪水：5000
 */